import * as Api from '../apis/useDemand'; //TODO
import {
    observable,
    action,
} from 'mobx';
import {
    WeaForm,
    WeaTableNew,
    WeaSwitch,
} from 'comsMobx';
import {
    WeaLocaleProvider,
    WeaFormItem,
    WeaMoreButton,
} from 'ecCom';
import {
    message,
    Button,
    Row,
    Col,
    Modal,
} from 'antd';
const {
    TableStore
} = WeaTableNew;
const getLabel = WeaLocaleProvider.getLabel;
const confirm = Modal.confirm;

export class HrmUsedemand {
    //*************************index********************************
    @observable main = {
        authorized: false,
        loading: true,
    }

    @action
    getAuth = () => {
        Api.getAuth().then(cb => {
            const {
                status,
                hasRight
            } = cb;

            if (status == '1') {
                hasRight && this.grantAuth();
                this.getTableInfo();
                this.stoploading();
            } else {
                message.error();
            }
        }).catch(error => {
            message.error();
        });
    }

    @action
    grantAuth = () => {
        this.main.authorized = true;
    }

    @action
    stoploading = () => {
        this.main.loading = false;
    }

    refresh = () => {
        this.getRadioGroupDatas();
    }

    onresize = () => {
        const {
            key
        } = this.tabs;

        [0, 1, 2].map(val => {
            this.barCharts[`echart${val}`] && this.barCharts[`echart${val}`].chart && this.barCharts[`echart${val}`].chart.resize();
        })

        this.tabs[`echart${key}`] && this.tabs[`echart${key}`].chart && this.tabs[`echart${key}`].chart.resize();
    }


    //*************************Top*******************************
    @observable top = {
        title: getLabel('6131', "用工需求"), //todo
        menu: [],
    }

    @action
    getMenus = () => {
        Api.getButtonsMenu().then(cb => {
            const {
                api_status,
                btnMenu
            } = cb;

            if (api_status) {
                this.top.menu = btnMenu;
            } else {
                message.error();
            }
        }).catch(error => {
            message.error();
        });
    }

    get menus() {
        const top = this.top.menu.filter(item => item.isTop == '1'),
            right = this.top.menu;

        let buttons = [],
            dropMenuDatas = [];

        const {
            tableStore
        } = this.table;

        top.map((item, i) => {
            buttons.push(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@kav8mn@${i}`} type='primary' disabled={tableStore.loading} onClick={() => this.handleTopBtnsClick(item)}>{item.menuName}</Button>); //TODO
        });

        right.map((item, index) => {
            let obj = {
                key: item.menuFun,
                icon: <i className={`${item.menuIcon}`}/>,
                content: item.menuName,
                disabled: tableStore.loading,
                onClick: () => this[item.menuFun](item.menuFun)
            }
            if (item.menuFun == 'log' || item.menuFun == 'collection') {
                obj.disabled = true;
            }
            dropMenuDatas.push(obj);
        })

        return {
            buttons,
            dropMenuDatas
        };
    }

    @action
    handleTopBtnsClick = (item) => {
        this[item.menuFun] && this[item.menuFun](item.menuFun)
    }

    exportExcel = () => {
        const params = {
            ...this.radioGroup.params
        };
        Api.getDetailSearchList(params).then(datas => {
            const {
                sessionkey
            } = datas;
            Api.exportExcel(sessionkey).then(data => {
                if (data.url) {
                    window.location.href = data.url;
                }
            })
        })
        // this.table.tableStore.exportAll();
    }

    //*************************RadioGroup*******************************
    @observable radioGroup = {
        config: [],
        loading: false,
    }

    @action
    getRadioGroupDatas = () => {
        this.radioGroup.loading = true;
        this.radioGroup.config = [];

        Api.getRadioGroupDatas().then(cb => {
            const {
                api_status,
                conditions
            } = cb;

            if (api_status) {
                this.radioGroup.config = conditions[0].items;
                this.radioGroup.loading = false;
            } else {
                message.error();
            }
        }).catch(error => {
            message.error();
        });
    }

    @action
    resetRadioGroup = () => {
        this.radioGroup.config = [];
        this.radioGroup.loading = false;
    }

    @action
    radioGroupCallBack = (params) => {
        const {
            demandRegDateSelect,
            demandRegYear,
            company,
            subcompanyid,
            departmentid,
            jobtitle,
            jobtitleId,
        } = params;

        this.radioGroup.params = params;

        ['getBarChartsDatas', 'getSummaryDatas', 'getTabsDatas'].map(f => {
            const b1 = demandRegDateSelect == '6' && !demandRegYear,
                b2 = (company == '1' && !subcompanyid) || (company == '2' && !departmentid),
                b3 = jobtitle == '1' && !jobtitleId;

            if ([b1, b2, b3].some(b => b)) {
                return
            }
            this[f]();
        })
    }

    //*************************Top*******************************
    @observable summary = {
        countDatas: [],
        loading: false,
    }

    @action
    getSummaryDatas = () => {
        this.summary.loading = true;

        const {
            params = {}
        } = this.radioGroup;

        Api.getSummaryDatas(params).then(cb => {
            const {
                api_status,
                countDatas
            } = cb;

            if (api_status) {
                this.summary.countDatas = countDatas;
                this.summary.loading = false;
            } else {
                message.error();
            }
        }).catch(error => {
            message.error();
        });
    }

    @action
    resetSummaryDatas = () => {
        this.summary.config = [];
        this.summary.loading = false;
    }

    //*************************BarCharts*******************************
    @observable barCharts = {
        charts: [],
        loading: false,
    }

    @action
    getBarChartsDatas = () => {
        this.barCharts.loading = true;

        const {
            params = {}
        } = this.radioGroup;


        Api.getBarChartsDatas(params).then(cb => {
            const {
                api_status,
                charts
            } = cb;

            if (api_status) {
                this.adjustCharts(charts);
                this.barCharts.charts = charts;
                this.barCharts.loading = false;
            } else {
                message.error();
            }
        }).catch(error => {
            message.error();
        });
    }

    @action
    adjustCharts = (charts) => {
        [0, 1].map(v => {
            const yAxis = charts[v].option.yAxis,
                series = charts[v].option.series,
                {
                    data
                } = series[0];

            series[0].barWidth = `${data.length*9}%`;

            yAxis.data = this.getYAxisData({
                datas: yAxis.data,
                index: v
            });

            charts[v].option.yAxis.axisLabel = this.getAxisLabel();
        })

    }

    getYAxisData = (params) => {
        const {
            datas,
            index
        } = params;

        let nd = [],
            tIds = [];

        datas.map(data => {
            data.split(' ').map((d, i) => {
                if (i == 0) {
                    nd.push(d);
                } else {
                    tIds.push(d.split(':')[1].split('}')[0]);
                }
            });
        });

        this.barCharts[(index == '0') ? 'lIds' : 'rIds'] = tIds;

        return nd;
    }

    getAxisLabel = () => {
        var _this = this;
        return ({
            formatter: function(value) {
                let len = _this.getValueLength(value);
                if (len > 12) {
                    return `${_this.sliceValue(value, 12)}...`;
                } else {
                    return value;
                }

            }
        })
    }

    sliceValue(value, len) {
        let temp = [];
        let count = 0;
        value.split('').map(val => {
            if (count < len) {
                temp.push(val);
                count += this.checkIsChinese(val) ? 2 : 1;
            }
        });
        return temp.join('');
    }


    getValueLength = (values) => { //TODO
        let len = 0;

        values.split('').map((v, i) => {
            const a = v.charAt(i);
            if (a.match(/[^\x00-\xff]/ig) != null) {
                len += 2;
            } else {
                len += 1;
            }
        });

        return len;
    }


    checkIsChinese(val) {　　
        let reg = new RegExp("[\\u4E00-\\u9FFF]+", "g");　　
        if (reg.test(val)) return true
    }

    @action
    resetBarCharts = () => {
        this.barCharts.charts = [];
        this.barCharts.loading = false;
    }

    @action
    setRef = (params) => {
        const {
            ref,
            alias,
            type
        } = params;

        if (type == 'barCharts') {
            this.barCharts[alias] = ref;
        } else {
            this.tabs[alias] = ref;
        }
    }


    //*************************Tabs*******************************
    @observable tabs = {
        charts: [],
        key: '0',
        loading: false,
    }

    @action
    getTabsDatas = () => {
        this.tabs.loading = true;

        const {
            params = {}
        } = this.radioGroup;

        Api.getTabsDatas(params).then(cb => {
            const {
                api_status,
                charts,
            } = cb;

            if (api_status) {
                this.adjustChart(charts);
                this.tabs.charts = charts;
                this.tabs.loading = false;
            } else {
                message.error();
            }
        }).catch(error => {
            message.error();
        });
    }

    adjustChart = (charts) => {
        charts.map(chart => {
            const datas = chart.option.series[0].data;
            datas.map(d => {
                d.label = this.formatLabel(datas.length);
            })
        });
    }

    formatLabel(length) {
        if (length < 10) {
            return ({
                normal: {
                    formatter: [
                        '{title|{b}}{abg|}',
                        '{c} | {rate|{d}%}',
                    ].join('\n'),
                    rich: {
                        title: {
                            color: '#666',
                            align: 'center',
                        },
                        abg: {
                            width: '100%',
                            align: 'right',
                            height: 25,
                        },
                        rate: {
                            fontFamily: 'Times New Roman',
                        }
                    }
                }

            })
        } else {
            return ({
                normal: {
                    formatter: [
                        '{b} | {c} | {d}%',
                    ].join('\n'),
                }
            })
        }

    }

    @action
    resetTabs = () => {
        this.tabs.charts = [];
        this.tabs.key = '0';
        this.tabs.loading = false;
    }

    @action
    tabsCallback = (key) => {
        this.tabs.key = key;
        this.getTabsDatas();
    }

    //*************************MainDialog*******************************
    @observable mainDialog = {
        visible: false,
        title: '',
    }

    get buttons() {
        const {
            tableStore
        } = this.table;

        const buttons = [
            (<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@4muaek`} type="primary" disabled={tableStore.loading} onClick={() => tableStore.exportAll()}>{getLabel('28343', "导出Excel")}</Button>),
            (<WeaMoreButton ecId={`${this && this.props && this.props.ecId || ''}_WeaMoreButton@3arlja`} datas={this.dropMenuDatas} />)
        ]

        return buttons;
    }

    get style() {
        const {
            type
        } = this.mainDialog;

        return {
            width: ['more0', 'more1'].includes(type) ? 800 : 1050,
            height: 700
        }
    }

    get dropMenuDatas() {
        const {
            tableStore
        } = this.table;

        const datas = [{
            key: '0',
            disabled: tableStore.loading,
            icon: <i className='icon-coms-export' />,
            content: getLabel('28343', "导出Excel"),
            onClick: () => tableStore.exportAll(),
        }, {
            key: '1',
            disabled: tableStore.loading,
            icon: <i className='icon-coms-Custom' />,
            content: getLabel('32535', '显示列定制'),
            onClick: () => {
                tableStore.setColSetVisible(true);
                tableStore.tableColSet(true)
            },
        }];

        return datas;
    }

    @action
    openDialog = (params) => {
        const {
            type,
            field,
            index
        } = params;

        this.mainDialog.type = type;
        this.mainDialog.visible = true;
        this.tab.field = field; //TODO 拼接field

        this.barCharts.index = index;

        let title;
        if (type == 'more0') {
            title = getLabel('391170', "需求最多部门排名")
        } else if (type == 'more1') {
            title = getLabel('391171', "需求最多岗位排名")
        } else {
            title = getLabel('15729', "具体信息")
        }
        this.mainDialog.title = title;
    }

    @action
    closeDialog = () => {
        this.mainDialog.visible = false;
    }


    //*************************Tab*******************************
    @observable tab = {
        isPanelShow: false,
        conditionCount: 10, //TODO
        form: new WeaForm(),
        conditions: [],
        searchBaseValue: '',
    }


    get buttonsAd() {
        const {
            form
        } = this.tab;

        let buttonsAd = [];
        [0, 1, 2].map((v, i) => {
            const func = (v == 0) ? 'handleSearch' : 'changePanelStatus';
            const name = (v == 0) ? getLabel(82529, '搜索') : (v == 1) ? getLabel(27088, '重置') : getLabel(32694, '取消');
            buttonsAd.push(<Button ecId={`${this && this.props && this.props.ecId || ''}_Button@qnhk7v@${i}`} type={v==0 ? "primary" : ''} onClick={() => {v==1 ? form.reset() : this[func]()}}>{name}</Button>);
        });

        return buttonsAd;
    }

    get searchsAd() {
        const {
            form,
            conditions,
            field,
        } = this.tab, {
            isFormInit
        } = form;

        let arr = [];
        isFormInit && conditions.map(c => {
            c.items.map((field, index) => {
                arr.push(<Col ecId={`${this && this.props && this.props.ecId || ''}_Col@734ynt@${index}`} span={10} offset={1}>
                              <div style={{marginTop: 20}}>
                                  <WeaFormItem ecId={`${this && this.props && this.props.ecId || ''}_WeaFormItem@lnlozf@${index}`}
                                      label={`${field.label}`}
                                      labelCol={{span: 6}}
                                      wrapperCol={{span: 18}}>
                                          {<WeaSwitch ecId={`${this && this.props && this.props.ecId || ''}_WeaSwitch@24kb1l@${index}`} fieldConfig={field} form={form} formParams={form.getFormParams()} />}
                                  </WeaFormItem>
                              </div>
                         </Col>)
            })
        })

        if (isFormInit && field) {
            const {
                index
            } = this.barCharts;

            form.updateFields({
                [index == '0' ? 'departmentid' : 'jobtitleId']: field
            })
        }

        return <Row ecId={`${this && this.props && this.props.ecId || ''}_Row@i8nmvd`}
            onKeyDown={(e) =>( e.keyCode == 13 && e.target.tagName === "INPUT")  && this.handleSearch()}
        >{arr}</Row>
    }

    @action
    changePanelStatus = (bool) => {
        this.tab.isPanelShow = bool;
    }

    @action
    handleSearch = () => {
        const {
            isPanelShow
        } = this.tab;

        isPanelShow && this.changePanelStatus(false);
        this.getTableInfo();
    }

    @action
    getSearchCondition = () => {
        Api.getSearchCondition().then(rs => {
            const {
                api_status,
                conditions
            } = rs;

            if (api_status) {
                this.tab.conditions = conditions;
                this.tab.form.initFormFields(conditions);
            } else {
                message.error();
            }
        }).catch(error => {
            message.error();
        });
    }

    @action
    resetTab = () => {
        this.tab.isPanelShow = false;
        this.tab.conditions = [];
        this.tab.form = new WeaForm();
    }

    @action
    setSearchBaseValue = (value) => {
        this.tab.searchBaseValue = value;
    }

    //*************************table*******************************
    @observable table = {
        tableStore: new TableStore(),
    }

    @action
    getTableInfo = () => {
        const {
            form,
            searchBaseValue,
            field,
        } = this.tab, {
            type
        } = this.mainDialog, {
            params
        } = this.radioGroup, {
            index
        } = this.barCharts;

        let func;
        let cParams;
        if (type == 'more0') {
            func = 'getMoreDeptList';
            cParams = {
                departmentName: searchBaseValue,
                ...params,
            };
        } else if (type == 'more1') {
            func = 'getMoreJobtitleList';
            cParams = {
                jobtitleName: searchBaseValue,
                ...params,
            };
        } else {
            func = 'getDetailSearchList';
            cParams = form.isFormInit ? form.getFormParams() : {
                [index == '0' ? 'departmentid' : 'jobtitleId']: field && field.value,
                ...params,
            };
            Object.assign(cParams, {
                jobtitleName: searchBaseValue,
            });
        }

        Api[func](cParams).then(cb => {
            const {
                api_status,
                sessionkey,
            } = cb;

            if (api_status) {
                this.table.tableStore.getDatas(sessionkey, 1);
            } else {
                message.error();
            }
        }).catch(error => {
            message.error();
        });
    }

    isEmptyObject = (obj) => {
        if (Object.keys(obj) == 0) return true
    }

    @action
    resetTable = () => {
        this.table.tableStore = new TableStore();
    }

}